package com.fx.zmlzml.util;

import com.fx.zmlzml.config.ApplicationContextHolder;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;

import java.util.Locale;

/**
 * 国际化消息工具类
 * 提供获取国际化消息的静态方法
 */
@Component
public class MessageUtils {

    /**
     * 获取MessageSource实例
     * 从ApplicationContextHolder中获取，确保在任何时候都能正确获取到MessageSource
     * @return MessageSource实例
     */
    private static MessageSource getMessageSource() {
        try {
            return ApplicationContextHolder.getBean(MessageSource.class);
        } catch (Exception e) {
            System.err.println("MessageUtils: Failed to get MessageSource from ApplicationContextHolder: " + e.getMessage());
            return null;
        }
    }

    /**
     * 获取国际化消息
     * @param code 消息代码
     * @return 国际化消息
     */
    public static String getMessage(String code) {
        return getMessage(code, null);
    }

    /**
     * 获取带参数的国际化消息
     * @param code 消息代码
     * @param args 消息参数
     * @return 国际化消息
     */
    public static String getMessage(String code, Object[] args) {
        return getMessage(code, args, "");
    }

    /**
     * 获取带参数和默认值的国际化消息
     * @param code 消息代码
     * @param args 消息参数
     * @param defaultMessage 默认消息
     * @return 国际化消息
     */
    public static String getMessage(String code, Object[] args, String defaultMessage) {
        // 获取当前线程的区域设置
        Locale locale = LocaleContextHolder.getLocale();
        
        // 从ApplicationContextHolder获取MessageSource
        MessageSource messageSource = getMessageSource();
        
        // 如果messageSource为null则返回默认消息
        if (messageSource == null) {
            // 添加日志以便调试
            System.err.println("MessageUtils: messageSource is null, cannot get message for code: " + code);
            return defaultMessage;
        }
        
        try {
            return messageSource.getMessage(code, args, defaultMessage, locale);
        } catch (Exception e) {
            // 如果获取消息失败，返回默认消息并打印错误信息
            System.err.println("MessageUtils: Failed to get message for code: " + code + ", error: " + e.getMessage());
            return defaultMessage;
        }
    }
}